import wepy from 'wepy'
import {wxLogin} from '../api/data'

const baseUrl = 'https://attendance.tesoon.com'

// wepy.login
// 登录过期后重新请求登录接口
// 请求微信登录接口
function _wxLoginRequest (success, fail) {
  wepy.login().then(res => {
    console.log('wepy.login success:', res)
    // 发送 res.code 到后台换取 openId, sessionKey, unionId
    getLoginToken({code: res.code, action: 'login'}).then((data) => {
      let token = data.data.data.token
      wepy.showToast({
        icon: 'none',
        title: '登录成功'
      })
      wepy.setStorageSync('auth_token', token)
      success && success(data.data)
    }).catch(err => {
      wepy.showToast({
        icon: 'none',
        title: '登录失败，请稍候重试'
      })
      fail && fail(err)
    })
  }).catch(err => {
    fail && fail(err)
    console.log('wepy.login fail:', err)
  })
}

let loginState = null // 是否登录中
let lastFailRequestCfg = []

/**
 * @param resolve promise resolve
 * @param reject promise reject
 * @param config 请求参数
 */
const awaitLoginCallback = (resolve, reject, config) => {
  wepy.removeStorageSync('auth_token')
  // 缓存请求，及promise处理函数
  lastFailRequestCfg.push({
    resolve,
    reject,
    config
  })
  // 正在登录时直接返回，由于当前请求promise状态为sending
  if (loginState === 'loading') {
    return
  }
  // 重新登录
  // 登录成功后，执行队列请求
  wepy.showLoading({
    title: '正在登录...'
  })
  loginState = 'loading'
  _wxLoginRequest((loginData) => {
    loginState = null
    wepy.setStorageSync('auth_token', loginData.data.token)
    // let allRequest = []
    // lastFailRequestCfg.forEach(item => {
    //   Object.assign(item.config.data, {token: loginData.data.token})
    //   allRequest.push(_wxRequest(item.config))
    // })
    wepy.hideLoading()
    wepy.showLoading({
      icon: 'none',
      title: '请求数据...'
    })
    lastFailRequestCfg.forEach(item => {
      Object.assign(item.config.data, {token: loginData.data.token})
      _wxRequest(item.config).then(res => {
        item.resolve(res)
        wepy.hideLoading()
      }).catch(err => {
        item.reject(err)
        wepy.hideLoading()
      })
    })
    // 清空请求队列缓存
    lastFailRequestCfg = []
  }, (err) => {
    reject(err)
  })
}

// 请求方法
function _wxRequest (opts) {
  let _url = opts.url || ''
  let _cfg = {
    url: _url.indexOf(baseUrl) === 0 ? _url : baseUrl + _url,
    method: opts.method || 'get',
    data: opts.data || {},
    // dataType: '其他',
    header: opts.headers || {}
  }
  // 发起网络请求
  return new Promise((resolve, reject) => {
    wepy.showNavigationBarLoading()
    wepy.request(_cfg).then(res => {
      let _errcode = res.data.errcode
      console.log('errcode', res.data.errcode)
      // 请求数据正常
      if (_errcode === 0) {
        resolve(res)
      } else if (_errcode === 10000 || _errcode === 10017 || _errcode === 10015) { // 登录过期，数据校验失败，。。。
        // 进入登录流程，函数传参，保存变量
        awaitLoginCallback(resolve, reject, _cfg)
      } else {
        wepy.showToast({
          icon: 'none',
          title: res.data.errMsg
        })
        reject(res)
      }
      wepy.hideNavigationBarLoading()
    }).catch(fail => {
      console.log('fail: errcode', fail)
      wepy.showToast({
        icon: 'none',
        title: fail.errMsg
      })
      reject(fail)
      wepy.hideNavigationBarLoading()
    })
  })
}

// 请求数据
const _Request = (method = 'get', url = '', data = {}, headers = {}, action) => {
  let _url = url
  let _data = data
  return new Promise(function (resolve, reject) {
    let _requestCfg = {
      method: method,
      url: _url,
      data: _data,
      headers: headers,
    }
    // 登录接口不需要token
    if (_data.action === 'login') {
      _wxRequest(_requestCfg).then((res) => {
        resolve(res)
      }).catch((err) => {
        reject(err)
      })
    } else {
      // 非登录接口如果没有token，先请求登录接口，返回token后台继续当前请求
      if (!wepy.getStorageSync('auth_token')) {
        wepy.showLoading({
          title: '正在登录...'
        })
        // 未登录登录后再次请求数据
        _wxLoginRequest((loginData) => {
          wepy.hideLoading()
          wepy.setStorageSync('auth_token', loginData.data.token)
          Object.assign(_requestCfg.data, {token: loginData.data.token})
          _wxRequest(_requestCfg).then((res) => {
            resolve(res)
          }).catch((err) => {
            reject(err)
          })
        }, (err) => {
          wepy.hideLoading()
          reject(err)
        })
      } else { // 有token直接请求数据
        Object.assign(_requestCfg.data, {token: wepy.getStorageSync('auth_token')})
        _wxRequest(_requestCfg).then((res) => {
          resolve(res)
        }).catch((err) => {
          reject(err)
        })
      }
    }
  })
}

_Request.get = (url, data, headers, action) => {
  return _Request('get', url, data, headers, action)
}
_Request.post = (url, data, headers, action) => {
  return _Request('post', url, data, headers, action)
}

export const request = _Request
export const wxLoginRequest = _wxLoginRequest
